home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 590 / doc / tricks.doc < prev   
Encoding:
Text File  |  1992-01-06  |  29.9 KB  |  958 lines

  1.           ===============================================
  2.  
  3. @(#)        OKAMI SHELL VERSION 1.4 - TIPS UND TRICKS
  4.  
  5.           ===============================================
  6.                  Stand: 26.12.91
  7.  
  8.  
  9.         BITTE ERST DIE DATEIEN README UND OKAMI.DOC LESEN!
  10.  
  11. ----------------------------------------------------------------------------
  12. INHALT
  13.  
  14.     Profile
  15.     Aufruf von Programmen
  16.     Benutzung der Shell von Diskette aus
  17.     Beispiel-Shellscripts
  18.         okback.sh
  19.         e.sh
  20.         showpic.sh
  21.         startprg.sh
  22.     Shell-Funktionen
  23.     Die gemexec-Funktion
  24.     Die screensave-Funktion
  25.     Speichern und Restaurieren der Shell-Einstellungen
  26.     MS-DOS-Gefühle
  27.     C-Shell-Gefühle
  28.     Andere Shells: Gulam, Master und bash
  29.     Die Versionsnummer der Shell
  30.     Diverses
  31.         Trikolor-Bildschirm
  32.         Aufruf vom Desktop
  33.         Uneindeutige Kommandonamen
  34.         Compiler-Aufruf
  35.         Ändern von Dateinamen-Extendern
  36.         Programmierung des UPN-Rechners
  37.  
  38. ----------------------------------------------------------------------------
  39. PROFILE
  40.  
  41. Ich benutze das folgende Profile zum Konfigurieren der Shell.
  42.  
  43.     # Okami-Shell - System-Profile
  44.  
  45.     TERM=Atari Mega ST4
  46.     # Cursor etwas schneller blinkend
  47.     cursor +bv 12
  48.     # Aktuelles Directory im Prompt anzeigen
  49.     PS1=['$CWD'] ^^^$'  '
  50.     # Pipes auf die Ramdisk
  51.     PIPDIR=i:\
  52.     # Nach Ende der Shell CWD sichern...
  53.     set +s
  54.     # ...und den Cursor abschalten
  55.     trap cursor -v
  56.     # Directories trennen wie in Unix mit Slash
  57.     set +b
  58.     # anmelden als Applikation, sollte man immer machen
  59.     gon
  60.     # Word Wrap On
  61.     echo ^033v
  62.  
  63.     # Bidschirm löschen durch viele Leerzeilen
  64.     echo "^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n"
  65.  
  66.     # Einschaltmeldung
  67.     echo 
  68.     echo $TERM
  69.     # Versionsnummer der Shell, des TOS und von MiNT
  70.      ver -otM
  71.     echo
  72.     # Ausgabe des Datums des letzten Logins
  73.     cat lastlog 2>NULL:
  74.     echo
  75.     # Ausgabe des freien Speichers
  76.     echo Free RAM: `mem` Bytes
  77.     echo
  78.     # Ausgabe in invertierter Schrift
  79.     echo ^033pType help for command survey.^033q
  80.     echo
  81.     # Datum speichern
  82.     echo Last Login: `date` >lastlog
  83.     # Letztes CWD zurückholen
  84.     cd `cat wdir`
  85.  
  86.  
  87. Laufwerk I ist eine Ramdisk, die die Aufgabe hat, die Pipe-Operationen
  88. zu beschleunigen. Dadurch, daß die Pipe auf die Ramdisk gelegt wird
  89. (PIPDIR=i:\), erfolgen alle Pipe-Operationen ohne Plattenzugriff.
  90. Durch die Einstellung "set +s" wird die Shell veranlaßt, vor dem Pro-
  91. grammende das aktuelle Verzeichnis in die Datei $HOME\wdir zu schrei-
  92. ben. Das Profile benutzt diese Datei, um das aktuelle Verzeichnis wieder
  93. auf den alten Wert einzustellen. So ist man nach dem Start der Shell im-
  94. mer in dem Verzeichnis, in dem man war, als man die Shell zuletzt ver-
  95. lassen hatte.
  96.  
  97. Durch die Einstellung "set +x" werden in einer Eingabe alle Slashes (/)
  98. in Backslashes (\) umgeformt, wodurch man die Möglichkeit hat, Dateina-
  99. men wie in Unix einzugeben, also shell/bin/sh.ttp anstatt shell\bin\sh.ttp.
  100. Natürlich erzeugt dann das Kommando
  101.     echo 6/3=2
  102. die Ausgabe
  103.     6\3=2
  104. da alle Slashes umgeformt werden, aber das stört normalerweise nicht.
  105. (den UPN-Rechner stört es übrigens auch nicht, da er den Backslash als-
  106. Divisionszeichen versteht. Aus "upn 6 3 /" wird also "upn 6 3 \".)
  107. Außerdem kann man sich in Notfällen mit einfachen Anführungszeichen
  108. retten,
  109.     echo '6/3=2'
  110. ergibt also immer
  111.     6/3=2
  112. .
  113.  
  114. ----------------------------------------------------------------------------
  115. AUFRUF VON PROGRAMMEN
  116.  
  117. (Der folgende Abschnitt ist im wesentlichen für Festplattenbenutzer von
  118. Interesse.)
  119.  
  120. Viele Programme gehen davon aus, das sich gewisse Dateien wie z.B.
  121. RSCs im aktuellen Verzeichnis befinden. Um ein solches Kommando zu
  122. starten, muß man also mit cd in das jeweilige Verzeichnis wechseln, was
  123. unter Umständen einige Tipparbeit macht, vor allem bei einer Festplatte.
  124. Mit der Okami-Shell ist es möglich, Programme von überall, also von je-
  125. dem beliebigen aktuellen Verzeichnis aus zu starten.
  126. Es sei z.B. GEMTEST.PRG ein Programm, das im Verzeichnis
  127. D:\PROG\GEMTEST steht und eine RSC-Datei aus dem aktuellen Ver-
  128. zeichnis nachladen muß.
  129. Zum Start des Programms müßte man also eingeben
  130.  
  131.     cd d:\prog\gemtest
  132.     gemtest
  133.  
  134. Man kann allerdings auch so vorgehen:
  135. Man erzeugt sich eine Datei namens GEMTEST.SH im Verzeichnis
  136. $HOME\bin, die ungefähr so aussieht:
  137.  
  138.     A=`set -`
  139.     set +x
  140.     d:\prog\gemtest.prg
  141.     set $A
  142.     unset A
  143.  
  144. Zuerst wird die aktuelle Einstellung der Flags in der Shellvariablen A ge-
  145. speichert, danach wird das Flag x aktiviert. Wenn dieses Flag aktiviert
  146. ist, führt die Shell vor dem Start eines Binärprogramms ein cd in das Di-
  147. rectory aus, in dem sich das Programm befindet. Nach dem Ende des
  148. Programms wird das ursprüngliche Directory wieder restauriert.
  149. Danach wird das Programm gestartet.
  150. Nach Programmende werden die Shell-Flags werden auf den gespeicher-
  151. ten Wert zurückgesetzt. Danach wird die lokal verwendete Shellvariable A
  152. freigegeben.
  153. Wenn das Flag -x immer gesetzt ist, kann man denselben Effekt errei-
  154. chen durch:
  155.     hash gemtest d:/prg/gemtest/gemtest.prg
  156.  
  157. Normalerweise ist das Flag x immer aktiviert. Programme, die sich in ei-
  158. nem der in der Shellvariablen PATH gespeicherten Directories befinden,
  159. werden also immer korrekt gestartet, indem man nur ihren Namen eingibt.
  160.  
  161. ----------------------------------------------------------------------------
  162. BENUTZUNG DER SHELL VON DISKETTE AUS
  163.  
  164. Wenn möglich, sollte man die Shell auf einem schnellen Massespeicher
  165. wie Festplatte oder Ramdisk installieren. Wer die Shell hauptsächlich mit
  166. Disketten benutzt, ärgert sich vermutlich darüber, daß es ziemlich lange
  167. dauert, bis ein falsch eingetipptes Kommando als solches erkannt wird, da
  168. die Shell in allen möglichen Ordnern auf der Diskette nach einer passen-
  169. den Datei sucht. Mit den folgenden Einstellungen im Profile kann die An-
  170. zahl dieser Suchoperationen minimiert werden:
  171.  
  172.     PATH=.,$HOME\bin
  173.     CDPATH=.
  174.  
  175. Wenn man den Programm-Suchpfad auf das aktuelle Directory abkürzt
  176. (mit der Einstellung "PATH=."), werden noch weniger Suchoperationen
  177. durchgeführt, man kann dann allerdings die mitgelieferten externen Kom-
  178. mandos, die sich in dem Directory $HOME/bin befinden sollten, nicht
  179. mehr von überallher durch den einfachen Kommandonamen aufrufen, son-
  180. dern muß den ganzen Pfad angeben (z.B. nicht einfach "format", sondern
  181. "$HOME\bin\format.ttp").
  182.  
  183. ----------------------------------------------------------------------------
  184. BEISPIEL-SHELLSCRIPTS
  185.  
  186. 1) okback.sh
  187.  
  188. Ich benutze das folgende Shellscript zum Sichern der Quelldateien der
  189. Shell auf Diskette. Es wird ein lzh-Archiv auf der Diskette angelegt, in
  190. das die seit dem letzten Backup geänderten Dateien hineingeschrieben
  191. werden.
  192.  
  193.     # Temporär-Directory
  194.     DIR=M:/tmp/okbak
  195.     # Liste der zu sichernden Dateien
  196.     FILES=*.c *.h sh.prj
  197.  
  198.     alert stop 1 "Bitte die Okami-Backup-^|Diskette einlegen."     ^
  199.         "Ok^|Abbruch" ERG
  200.     if [ $ERG = 2 ]
  201.     then
  202.       exit
  203.     fi
  204.  
  205.     # Temp-Dir anlegen und Archiv von der Diskette hineinkopieren
  206.     mkdir -r $DIR/
  207.     cp -v a:/okbak.lzh $DIR
  208.  
  209.     # geänderte Dateien ins Archiv einfügen.
  210.     # lharc ist ein externes Kommando.
  211.     lharc a -by $DIR/okbak.lzh $FILES
  212.  
  213.     # Archiv wieder auf Diskette speichern
  214.     cp -v $DIR/okbak.lzh a:/
  215.     # Log-Eintrag auf der Diskette erzeugen
  216.     echo Okami-Source-Backup vom `date` >>a:/okbak.log
  217.  
  218.     # Temp-Directory entfernen
  219.     rm -r $DIR
  220.     unset DIR FILES ERG
  221.  
  222.  
  223.  
  224. 2) e.sh
  225.  
  226. Das Shellscript e.sh dient zum Aufruf des Editors. Das Editorprogramm
  227. befindet sich in der Datei $HOME\bin\editor.prg. Durch die Verwendung
  228. dieses Shellscripts ist es möglich, irgendwo im Dateisystem den Editor für
  229. irgendeine Datei aufzurufen.
  230.  
  231.  
  232.     FILE=$*
  233.     if [ -v FILE ]
  234.     then
  235.       FILE=$EFILE
  236.     fi
  237.     FILE=`fullname $FILE`
  238.     $HOME\bin\editor.prg $FILE
  239.     EFILE=$FILE
  240.     unset FILE
  241.  
  242.  
  243.  
  244. Der Name der zu editerenden Datei wird dem Script als Parameter über-
  245. geben.
  246. Die Zeile "FILE=`fullname $FILE`" erzeugt in der Variablen FILE den
  247. absoluten Dateinamen, der dem Editorprogramm als Parameter übergeben
  248. wird.
  249.  
  250. Wenn dieses Script ohne Parameter aufgerufen wird, so wird der in der
  251. Shellvariablen EFILE gespeicherte Dateiname benutzt. In dieser Variablen
  252. wird nach jedem Editoraufruf der jeweilige Dateiname gespeichert, so daß
  253. man, wenn man dieselbe Datei mehrmals hintereinander editieren möchte,
  254. den Dateinamen nur einmal angeben muß:
  255.  
  256.     e datei.txt            editieren von datei.txt
  257.     e datei2.txt            editieren von datei2.txt
  258.     e                    ebenfalls datei2.txt
  259.  
  260. Ggfs. muß man dieses Script noch erweitern, um dem Editor mehrere Pa-
  261. rameter zu übergeben (für den Micro-Emacs z.B. den Namen der Konfi-
  262. gurationsdatei o.ä.).
  263.  
  264.  
  265.  
  266. 3) showpic.sh
  267.  
  268. Dieses Script zeigt, wie man die Shell programmieren kann. Es dient da-
  269. zu, Bilddateien, die im Bitmap-Screenformat abgespeichert wurden (Datei-
  270. länge >32000 Bytes), zu laden und anzuzeigen. Es gehört zum Lieferum-
  271. fang der Shell, die Bedienungsanleitung befindet sich in commands.doc.
  272.  
  273.  
  274.  
  275. 4) startprg.sh
  276.  
  277. Die Idee zu diesem Shellscript stammt von Thomas Behrens aus Eschwei-
  278. ler und lautet, ein Programm in einer Fileselectbox auszuwählen und dann
  279. zu starten. Dazu genügt eigentlich die folgende Zeile:
  280.     fsel | xargs {}
  281. oder noch einfacher
  282.     `fsel`
  283. , wenn man aber den Abbruch-Button der Box abtesten und dem Pro-
  284. gramm eine Parameterzeile übergeben will, sollte man folgendes Script
  285. benutzen:
  286.  
  287.     FILE=`fsel *.* "" KEY "Welches Programm ausführen?"`
  288.     if [ $KEY = 1 ]
  289.     then
  290.       echo "Bitte Kommandozeile eingeben:"
  291.       read CMD
  292.       $FILE $CMD
  293.     fi
  294.     unset FILE KEY CMD
  295.  
  296. Beide Lösungen funktionieren übrigens sowohl mit Binärprogrammen als
  297. auch mit Shellscripts.
  298.  
  299. ---------------------------------------------------------------------------
  300. SHELL-FUNKTIONEN
  301.  
  302. Natürlich sollte man alle häufig gebrauchten Shellscripts resident halten,
  303. und zwar als Shellfunktionen. Es ist möglich, ein Shellscript so zu schrei-
  304. ben, daß es sich beim ersten Aufruf selber als Funktion installiert; bei al-
  305. len weiteren Aufrufen wird dann die Funktion benutzt.
  306.  
  307. Sei z.B. folgendes Shellscript in der Datei hallo.sh, also unter dem Na-
  308. men hallo aufzurufen:
  309.  
  310.     echo Hallo Anwender!
  311.     echo Der freie Speicherplatz beträgt `mem` Bytes.
  312.     echo Auf Platte C: sind `df -f c:` Bytes frei.
  313.  
  314.  
  315. Setzt man nun die Zeilen
  316.     hallo()
  317.     {
  318. an den Beginn und die Zeilen
  319.     }
  320.     hallo
  321. an das Ende dieses Scripts, also so:
  322.  
  323.     hallo()
  324.     {
  325.       echo Hallo Anwender!
  326.       echo Der freie Speicherplatz beträgt `mem` Bytes.
  327.       echo Auf Platte C: sind `df -f c:` Bytes frei.
  328.     }
  329.     hallo
  330.  
  331. , so wird beim Start des Scripts die Shellfunktion hallo installiert, und bei
  332. jedem weiteren Aufruf von hallo wird nicht das Script, sondern die Funk-
  333. tion aufgerufen. Mit dem Kommando
  334.  
  335.     unset hallo
  336.  
  337. kann man die Funktion wieder aus dem Speicher entfernen.
  338.  
  339.  
  340. Die Shellfunktionen machen übrigens eine alias-Funktion völlig überflüssig,
  341. da sie auch benutzt werden können, um interne Kommandos umzudefinie-
  342. ren: Wer anstelle von ls lieber ls -C hat, gibt einfach ein
  343.  
  344.         ls()
  345.         {
  346.           !ls -C $*
  347.         }
  348.  
  349. Das Ausrufezeichen verhindert, daß sich die ls-Funktion selber aufruft. !ls
  350. ist immer das interne Kommando ls. Wer irgendwann das normale ls be-
  351. nutzen will, kann das tun, indem er es als !ls aufruft.
  352.  
  353. Ebenso helfen Shellfunktionen, Tippfehler zu vermeiden; wer ständig dor
  354. oder dior statt dir tippt, versuche
  355.  
  356.         dior()
  357.  
  358.         {
  359.           dir $*
  360.         }
  361.  
  362. (Wer sich wundert, daß die Okami-Shell trotzdem ein alias-Kommando
  363. hat: das dient nur dazu, das Anlegen dieser Mini-Funktionen einfacher zu
  364. gestalten und um Shellscripts anderer Shells ausführen zu können. Man
  365. kann also ebenso schreiben:
  366.     alias ls !ls -C
  367. und
  368.     alias dior dir
  369. .)
  370.  
  371. Mein Unix-Tippfehler-Script enthält mehrere Dutzend Schreibweisen der
  372. häufig benutzten Kommandos wie dir, grep und der Make-Aufrufe xmake,
  373. qmake und remake.
  374.  
  375. Besondere Funktionen haben die vordefinierten (aber vom Anwender voll-
  376. ständig umdefinierbaren) Shellfunktionen gemexec und screensave, die in
  377. den folgenden Abschnitten beschrieben werden.
  378.  
  379. ---------------------------------------------------------------------------
  380. DIE GEMEXEC-FUNKTION
  381.  
  382. Mit der kann man wirklich einiges machen, denn sie gibt dem Anwender
  383. die Möglichkeit, das Verhalten der Shell beim Start von GEM-Programmen
  384. frei zu programmieren. Dabei stehen ihm alle die nicht zu unterschätzen-
  385. den Funktionen der Shell zur Verfügung.
  386.  
  387. Die folgende gemexec-Funktion kann benutzt werden, um nach dem Ende
  388. eines GEM-Programms den Bildschirm wieder so herzustellen, wie er vor
  389. dem Aufruf war.
  390. Dazu werden die internen Kommandos getscr und putscr sowie die VT52-
  391. Sequenzen zum Speichern und Wiederherstellen der Cursorposition be-
  392. nutzt. Dabei werden allerdings 32000 Bytes zum Speichern des Bildschir-
  393. minhaltes belegt. Aus diesem Grund speichert die Funktion den Bildschirm
  394. nur dann, wenn die Shellvariable SAVESCR gesetzt ist. Man kann das
  395. Speichern also mit
  396.         SAVESCR=1
  397. ein- und mit
  398.         SAVESCR=
  399. wieder ausschalten.
  400.  
  401.     gemexec()
  402.     {
  403.       _=$0
  404.       if [ +v SAVESCR ]
  405.       then
  406.         # Cursorposition speichern
  407.         echo ^033j^c
  408.         # Bildschirm speichern
  409.         getscr
  410.       fi
  411.       # Bildschirm grau
  412.       scr -g
  413.       # Cursor unsichtbar
  414.       cursor -v
  415.       # das Gem-Programm ausführen
  416.       exec -g $_
  417.       if [ +v SAVESCR ]
  418.       then
  419.         # Bildschirm wiederherstellen
  420.         putscr
  421.         # Speicher freigeben
  422.         putscr -f
  423.         # Cursorposition wiederherstellen
  424.         echo ^033k^c
  425.         # Cursor wieder sichtbar
  426.         cursor +v
  427.       else
  428.         cls
  429.       fi
  430.       unset _
  431.     }
  432.  
  433.  
  434. Das folgende Beispiel zeigt, wie man das "Applikation anmelden" des
  435. Desktops auf diese Weise simulieren kann. Es macht alle Dateien mit Ex-
  436. tender .gfa und .c ausführbar. Beim Ausführen einer .gfa-Datei wird der
  437.  
  438. GFA-Basic-Interpreter, beim Ausführen einer .c-Datei der C-Compiler auf-
  439. gerufen. Alle anderen Programme werden wie üblich ausgeführt. Wichtig
  440. dabei ist, daß die Extender .gfa und .c sowohl in XEXT als auch in
  441. GEXT aufgeführt werden.
  442.  
  443.     XEXT=$XEXT,.gfa,.c
  444.     GEXT=$GEXT,.gfa,.c
  445.     gemexec()
  446.     {
  447.       _=$0 $*
  448.  
  449.       # Extender ermitteln, Flag setzen
  450.       F=0
  451.       E=`extname $_`
  452.  
  453.       # GFA-Basic? 
  454.       if [ $E = .gfa ]
  455.       then
  456.         F=1
  457.         exec -g d:/gfabasic/gfabasic.prg $_
  458.       fi
  459.       # C-Source?
  460.       if [ $E = .c ]
  461.       then
  462.         F=1
  463.         exec -g d:/compiler/cc.ttp $_
  464.       fi
  465.       # Weder-noch, also normal ausführen
  466.       if [ $F = 0 ]
  467.       then
  468.         # wie das Default-gemexec
  469.         cls
  470.         cursor -v
  471.         exec -g $_
  472.         cls
  473.       fi
  474.  
  475.       # Variablen freigeben
  476.       unset E F _
  477.     }
  478.  
  479. Die Benutzung des Flags $F entscheidet darüber, ob das Programm am
  480. Ende doch noch mit exec -g aufgerufen wird.
  481.  
  482. ---------------------------------------------------------------------------
  483. DIE SCREENSAVE-FUNKTION
  484.  
  485. Wenn in der Eingabe Control-P gedrückt wird, ruft die Shell die Shell-
  486. funktion screensave auf. In der Voreinstellung wird dadurch die normale
  487. Drucker-Hardcopy ausgelöst (was sinnvoll ist, wenn die Tastenkombination
  488. Alt-Help von einem residenten Programm okkupiert ist), aber durch Än-
  489. dern der screensave-Funktion kann der Anwender jede beliebige Operation
  490. durch Ctrl-P auslösen lassen. Die folgenden drei screensave-Funktionen
  491. dienen dazu, die Hardcopy ähnlich dem Snapshot-Programm in eine Datei
  492. umzuleiten.
  493.  
  494. Die erste Version fragt den Anwender mit einer Fileselect-Box nach dem
  495. Dateinamen. Diese Funktion geht davon aus, daß gon aktiviert ist.
  496. Alle Versionen stellen während des Speicherns den Cursor auf nichtblin-
  497. kend und schalten ihn, wenn die Shell wieder zur Eingabe bereit ist, wie-
  498. der auf blinkend zurück. Wer das nicht will, läßt die cursor-Aufrufe weg.
  499.  
  500.     screensave()
  501.     {
  502.       # Cursor nicht blinkend
  503.       cursor -b
  504.       # Bildschirm sichern
  505.       getscr
  506.       # nach einem Dateinamen fragen
  507.       fsel *.pic "" KEY "Dateiname für Hardcopy?" | read FILE
  508.       # Abbruch geklickt?
  509.       if [ $KEY = 1 ]
  510.       then
  511.         # nein, in die Datei speichern
  512.         putscr -s $FILE
  513.       fi
  514.       # Speicher und Variablen freigeben
  515.       putscr -f
  516.       unset KEY FILE
  517.       # Cursor wieder blinkend
  518.       cursor +b
  519.     }
  520.  
  521. Die zweite Version verhält sich eher wie das Snapshot-Programm. Sie
  522. baut selber einen Dateinamen zusammen. Der Dateiname ist "screen.",
  523. der Extender eine laufende Nummer. Der Zähler befindet sich in der
  524. Shellvariablen _SCRCOUNT, aufwärtsgezählt wird mit Hilfe des UPN-Rech-
  525. ners.
  526.  
  527.     screensave()
  528.     {
  529.       cursor -b
  530.       getscr
  531.       if [ -v _SCRCOUNT ]
  532.       then
  533.         # Wenn es die Zählvariable noch nicht gibt, 
  534.         # bei 0 anfangen
  535.         _SCRCOUNT=0
  536.       else
  537.         # ansonsten 1 addieren.
  538.         upn %ld $_SCRCOUNT ++ | read _SCRCOUNT
  539.         # Das Ergebnis lassen wir nicht auf dem Stack
  540.  
  541.          # rumliegen...
  542.         upn pop
  543.       fi
  544.       # wie oben.
  545.       putscr -s screen.$_SCRCOUNT
  546.       putscr -f
  547.       cursor +b
  548.       unset FILE
  549.     }
  550.  
  551. Die dritte Version fragt den Anwender, ob er die Hardcopy in eine Datei
  552. oder auf den Drucker haben möchte. Es benutzt dazu eine Alert-Box,
  553. funktioniert also nur, wenn gon aktiv ist. (Was aber kein Hindernis ist, da
  554. gon normalerweise im Profile steht und somit im normalen Betrieb immer
  555. aktiv ist. Nur in dem Profile für die Auto-Ordner-Shell sollte kein gon
  556. stehen.)
  557.  
  558.     screensave()
  559.     {
  560.       # Zuerst den Bildschirmspeicher sichern
  561.       cursor -b
  562.       getscr
  563.       # Dann den Anwender fragen
  564.       alert ques 1 "Bildschirm speichern nach..." ^
  565.       "Drucker^|Datei" A
  566.       read A
  567.       if [ $A = 1 ]
  568.       then
  569.         # Druckerausgabe, dazu den Bildschirm wieder so
  570.         # herrichten, wie er vor dem echo war
  571.         putscr
  572.         hardcopy
  573.       else
  574.         # Datei
  575.         .................... (wie eins der beiden obigen Beispiele)
  576.       fi
  577.       # Speicher freigeben
  578.       putscr -f
  579.       unset A
  580.       cursor +b
  581.     }
  582.  
  583. Man kann das natürlich beliebig weit treiben und ein komplettes Menü-
  584. programm schreiben, daß mit Ctrl-P aufgerufen wird.
  585.  
  586. ---------------------------------------------------------------------------
  587. SPEICHERN UND RESTAURIEREN DER SHELL-EINSTELLUNGEN
  588.  
  589. Die Okami-Shell bietet die Möglichkeit, einen großen Teil ihrer Einstellun-
  590. gen bei Programmende abzuspeichern und beim nächsten Programmstart
  591. wiederherzustellen. Die folgenden Kommandos sollte man in sein Profile
  592. schreiben, um die einzelnen Funktionen zu übernehmen.
  593.  
  594. 1. Das aktuelle Directory:
  595.     set +s
  596.  
  597. 2. Die history-Liste:
  598.     trap +history ^>$HOME/hist.sav
  599.     history -l <$HOME/hist.sav
  600.  
  601. 3. Die Shellvariablen:
  602.     trap +vars -x ^>$HOME/vars.sav
  603.     trap +export ^>>$HOME/vars.sav
  604.     trap +readonly ^>>$HOME/vars.sav
  605.     . $HOME/vars.sav
  606.  
  607. 4. Die Shellfunktionen:
  608.     trap +fcts -l ^>$HOME/fcts.sav
  609.     . fcts.sav
  610.  
  611. 5. Die set-Einstellungen:
  612.     trap +set - ^>$HOME/set.sav
  613.     xargs set <$HOME/set.sav
  614.  
  615. 6. Die Blinkrate des Cursors:
  616.     trap +cursor ^>$HOME/cursor.sav
  617.     xargs cursor <$HOME/cursor.sav
  618.  
  619. 7. Die Tastatureinstellung:
  620.     trap +keyb - ^>$HOME/keyb.sav
  621.     xargs keyb <$HOME/keyb.sav
  622.  
  623. 8. Die umdefinierten Funktionstasten:
  624.     trap +keydef list ^>$HOME/keydef.sav
  625.     . $HOME/keydef.sav
  626.  
  627. 9. Das Clipboard-Directory:
  628.     trap +echo 'clipb $CLIPDIR' ^>$HOME/clipb.sav
  629.     . $HOME/clipb.sav
  630.    Vorher sollte allerdins "gon" im Profile stehen.
  631.  
  632. 10. Die Laufwerksbezeichnungen:
  633.     trap +drive ^>$HOME/drive.sav
  634.     xargs drive <$HOME/drive.sav
  635.  
  636. 11. Die Hashtabelle:
  637.     trap +hash * ^>$HOME/hash.sav
  638.     . $HOME/hash.sav
  639.  
  640. 12. Den OverScan-Modus:
  641.     trap +echo overscan ^`overscan^` ^>$HOME/overscan.sav
  642.     . $HOME/overscan.sav
  643.  
  644. ---------------------------------------------------------------------------
  645. MS-DOS-GEFÜHLE
  646.  
  647. Die Unverbesserlichen, die sich statt wie in Unix lieber wie in MS-DOS
  648. fühlen wollen und das aktuelle Laufwerk nicht mit
  649.         cd a:
  650. , sondern einfach mit
  651.         a:
  652. einstellen wollen, können sich mit entsprechenden Shellfunktionen helfen.
  653. Setzt man sich folgende Zeilen für jedes angemeldete Laufwert ins Pro-
  654. file:
  655.  
  656.         a:()
  657.         {
  658.           cd a:
  659.         }
  660.         A:()
  661.         {
  662.           cd a:\
  663.         }
  664.  
  665. dann kann man durch Eingabe von a: das aktuelle Laufwerk a: einstellen
  666. und durch Eingabe von A: in Mupfel-Manier ins Rootdirectory von a:
  667. wechseln. Eine Liste der angemeldeten Laufwerke erhält man bekanntlich
  668. mit
  669.         df -m
  670. . Natürlich kann man sich diese Funktionen auch in eine eigene Datei,
  671. z.B. msdos.sh, schreiben und diese dann im Profile mit
  672.         . msdos.sh
  673. aufrufen. Unixfans erstellen außerdem eine Datei namens killmsdos.sh, in
  674. der sie mit den Zeilen
  675.         unset a: A:
  676. usw. (für jedes vorhandene Laufwerk) die MS-DOS-Funktionen wieder lö-
  677. schen.
  678.  
  679. ---------------------------------------------------------------------------
  680. C-SHELL-GEFÜHLE
  681.  
  682. Wer sich lieber wie in der C-Shell (/bin/csh) fühlt als wie in der
  683. Bourne-Shell, kann sich auch mit Shellfunktionen helfen.
  684. In der C-Shell werden Variablen mit dem set-Kommando gesetzt:
  685.  
  686.     set()
  687.     {
  688.       VAR=$1
  689.       VAL=$2 $3 $4 $5 $6 $7 $8 $9
  690.       $VAR=$VAL
  691.       unset VAR VAL
  692.     }
  693.  
  694. Environmentvariablen setzt man man mit setenv.
  695.  
  696.     setenv()
  697.     {
  698.       VAR=$1
  699.       VAL=$2 $3 $4 $5 $6 $7 $8 $9
  700.       $VAR=$VAL
  701.       export $VAL
  702.       unset VAR VAL
  703.     }
  704.  
  705. ---------------------------------------------------------------------------
  706. ANDERE SHELLS: GULAM, MASTER UND BASH
  707.  
  708. In manchen Punkten ist die Gulam-Shell unschlagbar, z.B. was den einge-
  709. bauten Editor angeht, in anderen Beziehungen hat Okami die Nase vorn
  710. (z.B. bei den Möglichkeiten von chmod und Pipes.) Man kann die Gulam-
  711. Shell von der Okami-Shell aus aufrufen, dabei werden alle exportierten
  712. Shellvariablen übergeben und können unter Gulam mit setenv angesehen
  713. werden (anders als Okami unterscheidet Gulam zwischen Environment-
  714. und Shell-Variablen).
  715.  
  716. Fast dasselbe gilt für dir kommerzielle Master-Shell, von der mir leider
  717. nur das Referenzhandbuch zur Verfügung stand. Obwohl Master eine Rei-
  718. he von Fähigkeiten hat, vor denen Okami sich respektvoll verbeugen muß,
  719. z.B. Unix-Filenamen und Regular Expressions bis auf TOS-Ebene, Links
  720. und Locks usw., ist Master doch in nicht allen Punkten voraus. Die Shell-
  721. funktionen von Okami sind dem alias-System sicherlich in ihrer Flexibilität
  722. weit überlegen (programmieren Sie mal while und if in ein alias), und
  723. Okami hat eine ganze Reihe von internen Kommandos, die die Program-
  724. mierung vereinfachen, z.B. basename, test, getscr/putscr usw., die Master
  725. vermissen läßt. Ein gewaltiges Plus für Okami ist natürlich der Preis: wer
  726. direkt bei mir bestellt, zahlt nicht mehr als zwei DM für Porto.
  727.  
  728. Die zu MiNT gehörende bash, die ebenso wie Okami an der Bourne-Shell
  729. orientiert ist, ist ebenfalls eine großartige Shell, hat aber den Nachteil,
  730. praktisch keine internen Kommandos zu haben. Man muß also alle Kom-
  731. mandos, auch ls, cp, rm usw., als separate Programmdateien auf der
  732. Platte haben. Obwohl das sehr Unix-like ist, bedeutet es einen enormen
  733. Platz- und Zeitbedarf; m.E. ist der Atari für so etwas nicht ganz der
  734. richtige Rechner.
  735. Durch ihre Möglichkeit, in der Kommandozeile nach "-c" Kommandos zur
  736. Asführung übergeben zu bekommen, kann die Okami-Shell so installiert
  737. werden, daß sie für die wesentlichen Kommandos von der bash aufgeru-
  738. fen wird.
  739.  
  740. ----------------------------------------------------------------------------
  741. DIE VERSIONSNUMMER DER SHELL
  742.  
  743.     "Was heißt Manta GTE?    - GETUNED EY!!!!!!"
  744.                     (unbekannter Manta-Witz-Erfinder)
  745.  
  746. Damit keine ähnlichen Mutmaßungen über die Bedeutung der Versions-
  747. nummer der Okami-Shell aufkommen, hier die genaue Beschreibung, was
  748. selbige uns zu sagen hat.
  749.  
  750. Die Versionsnummer, die in der Shell-Variablen $VERSION gespeichert ist
  751. und von dem ver-Kommando ausgegeben wird, gibt ziemlich genaue Aus-
  752. kunft über die vorliegende Version der Shell und ist folgendermaßen auf-
  753. gebaut:
  754.  
  755.     z.B. "1.3d+ X"
  756.  
  757.     1 :    die Hauptnummer (eine Zahl, gefolgt von einem Punkt) diese
  758. Nummer ändert sich nur unter besonderen Umständen, z.B.
  759. Portierungen auf andere Rechner oder größeren Umstellungen
  760. der Programmstruktur, Bedienung usw. Versionen mit unter-
  761. schiedlicher Hauptnummer sind nicht unbedingt kompatibel zu-
  762. einander.
  763.  
  764.     3 :    die Versionsnummer (eine Zahl)     kennzeichnet die laufende
  765. Nummer der Shell und ändert sich mit den     vollständigen (d.h.
  766. garantiert vollständig getesteten und dokumentierten) Versionen,
  767. die von Zeit zu Zeit veröffentlicht werden, wenn    mir mal eine
  768. Weile nichts neues einfällt (also nicht allzu häufig). Diese Ver-
  769. sionen werden über Pd-Versandstellen vertrieben.
  770.     
  771. Alle anderen Angaben treten optional auf:
  772.  
  773.     d :    die Zwischen-Release-Nummer (ein Kleinbuchstabe) kennzeich-
  774. net Releases, die zwischen den o.a. Versionen herauskommen.
  775. Wer seine Shell direkt bei mir bestellt, bekommt mit großer
  776. Wahrscheinlichkeit eine solche Zwischenversion. Sie sind im
  777. großen und ganzen fehlerfrei und dokumentiert, obwohl das
  778. hier nicht so sicher     ist wie    bei den Hauptversionen (die
  779. keine Zwischen-Release-Nummern haben).
  780.  
  781.     + :    die Test-Kennung, kennzeichnet Arbeitsversionen, die normaler-
  782. weise nicht veröffentlicht werden. Diese Versionen enthalten    
  783. möglicherweise noch Fehler.
  784.  
  785.     X :    die Erweiterungsspezifikation (ein oder mehrere Großbuchsta-
  786. ben) kennzeichnet erweiterte, verkürzte oder konfektionierte
  787. Versionen. Folgende Erweiterungsspezifikationen können auftre-
  788. ten:
  789.     C    es handelt sich um die "CLI-Only"-Version der Shell, die
  790. nur die wichtigsten Kommandos enthält.
  791.     F    die Version enthält eine höhere Anzahl von Shellfunktio-
  792. nen.
  793.     V    die Version enthält eine höhere Anzahl von Shellvariab-
  794. len.
  795.     L    die Version enthält eine höhere Anzahl von verschachtel-
  796. baren while-Ebenen.
  797.     X    die Version enthält sonstige Erweiterungen der Kapazität.
  798.  
  799.     R    die Version ist restriktiv, d.h. sie enthält wesentlich we-
  800. niger interne Kommandos als die regulären Versionen.
  801.     P    bei Programmstart wird das Profile immer geladen, außer
  802. es wird der Parameter "-" übergeben (die regulären Ver-
  803. sionen verhalten sich umgekehrt).
  804.     K    die Version ist auf die Wünsche eines bestimmten An-
  805. wenders konfektioniert.
  806.  
  807. Die zeitliche Reihenfolge der Versionen lautet also:
  808.  
  809.     1.3        Hauptrelease
  810.     1.3+        Arbeitsversion
  811.     1.3a        Zwischenrelease
  812.     1.3a+        Arbeitsversion
  813.     1.3b        Zwischenrelease
  814.     1.3b+        Arbeitsversion
  815.     ....
  816.     1.4        Hauptrelease
  817.     1.4+        Arbeitsversion
  818.     usw.
  819.  
  820. Eine genauere Analyse der Shell (Anzahl der möglichen Variablen, Shell-
  821. funktionen und geschachtelten whiles, maximale Zeilenanzahl des sort-
  822. Kommandos,Länge des History-Puffers, Größe des UPN-Stacks usw.) kann
  823. mit dem Kommando "ver -l" erzeugt werden.
  824.  
  825. ----------------------------------------------------------------------------
  826. DIVERSES
  827.  
  828. Trikolor-Bildschirm:
  829.  
  830. Durch Verwendung des Kommandos
  831.  
  832.     scr -b ; cursor +bv 1
  833.  
  834. auf einem Monochrom-Bildschirm blinkt der Cursor so schnell, daß er wie
  835. eine dritte Farbe auf dem Bildschirm wirkt. Dieser Effekt ist jedoch nur
  836. bei dunklem Hintergrund (scr -b) deutlich sichtbar.
  837.  
  838.  
  839. ~~~~~~~~~~~~~~~~~~~
  840. Aufruf vom Desktop:
  841.  
  842. Wenn man sh.ttp vom Desktop aufruft und eine Kommandozeile eingibt,
  843. die von der Shell ausgeführt werden soll, so erscheint nach der Ausfüh-
  844. rung dieser Kommandos wieder das Desktop, ohne daß der Anwender Zeit
  845. hat, eventuelle Ausgaben zu lesen.
  846. Um das zu verhindern, kann das read-Kommdando benutzt werden. Um
  847. z.B. für alle angemeldeten Laufwerke die Platzstatistik (mit dem Kom-
  848. mando df) zu erhalten, doppelklickt man auf sh.ttp und gibt folgende
  849. Kommandozeile ein:
  850.  
  851.     -c df ; read
  852.  
  853. oder
  854.  
  855.     -c df ; echo Taste: ; read
  856.  
  857. (Die Leerzeichen um die Strichpunkte sind nicht unbedingt notwendig).
  858. Nach der Ausführung von df wartet die Shell auf eine Eingabe (die durch
  859. Druck auf RETURN beendet sein muß). Im zweiten Beispiel wird außer-
  860. dem noch der Text "Taste:" ausgegeben.
  861.  
  862.  
  863. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  864. Uneindeutige Kommandonamen:
  865.  
  866. Wenn ein Programm denselben Namen wie ein internes Shellkommando
  867. hat, dann kann dieses Programm nicht einfach mit Namen aufgerufen
  868. werden. Hat man z.B. ein Script namens test.sh, dann wird durch Eingabe
  869. von "test" nicht das Script, sondern das interne Kommando "test" aufge-
  870. rufen. Um das zu verhindern, gibt man den Kommandonamen in Groß-
  871. buchstaben ein, also "TEST" oder "Test", dann wird das externe Komman-
  872. do aufgerufen. Das liegt daran, daß Groß-Kleinschreibung bei internen
  873. Kommandos von Bedeutung ist, bei Dateinamen und damit bei externen
  874. Kommandos aber nicht.
  875.  
  876.  
  877. ~~~~~~~~~~~~~~~~
  878. Compiler-Aufruf:
  879.  
  880. Folgende Zeilen habe ich im Aufrufshellscript für den Compiler:
  881.  
  882.     D=`date`
  883.  
  884.     echo $D
  885.     echo "#define _CMP_DAT" ^"$D^" >$INC/cmpdat.h
  886.  
  887.  
  888. Dies erzeugt bei jedem Compileraufruf eine Headerdatei namens cmpdat.h
  889. (die Environmentvariable INC speichert den Pfad der Headerdateien), in
  890. der ein Makro namens _CMP_DAT definiert wird, das das aktuelle Datum
  891. enthält, z.B.
  892.  
  893.         #define _CMP_DAT "03.07.1991 19:54:42"
  894.  
  895. Diese Datei in die C-Quellen eingebunden, und man hat in jedem Pro-
  896. gramm das individuelle Datum der Erstellung.
  897.  
  898. Wer einen Ansi-C-Compiler hat, ist darauf natürlich nicht angewiesen und
  899. kann stattdessen folgendes benutzen:
  900.  
  901.     #define _CMP_DAT __DATE__ " " __TIME
  902.  
  903. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  904. Ändern von Dateinamen-Extendern:
  905.  
  906. Die Kommandos basename, dirname und extname kann man benutzen, um
  907. den Extender einer Datei zu ändern, z.B. um zu einer C-Quelldatei den
  908. Namen der zugehörigen Objektdatei zu ermitteln.
  909.  
  910. Man kann dieses Kommando zusammen mit "dirname" benutzen, um z.B.
  911. zu dem Namen einer C-Quelldatei den Namen der zugehörigen Objektda-
  912. tei zu ermitteln.
  913.  
  914.     echo Bitte einen C-Quelldateinamen eingeben:
  915.     read FILE
  916.     EXT=`extname $FILE`
  917.     if [ $EXT != .c ]
  918.     then
  919.       echo Das ist keine C-Quelldatei!
  920.     else
  921.       DIR=`dirname $FILE`
  922.       FILE=`basename $FILE .c`
  923.       echo Die Objektdatei ist $DIR/$FILE.o
  924.     fi
  925.     unset FILE DIR
  926.  
  927. Ergibt:
  928.  
  929.     Bitte einen C-Quelldateinamen eingeben:
  930.     e:/okami/cmds4.c
  931.     Die Objektdatei ist e:/okami/cmds4.o
  932.  
  933. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  934. Programmierung des UPN-Rechners:
  935.  
  936. Der UPN-Rechner ist nicht wirklich programmierbar, aber es ist möglich,
  937. häufig benutzte Sequenzen von Kommandos in Shellvariablen abzulegen
  938. und diese dann mit dem UPN-Rechner zu benutzen. Die folgende Zeile
  939. speichert in der Variablen BKOEFF ein Programm zum Berechnen des
  940. Binominalkoeffizienten.
  941.  
  942.  
  943. BKOEFF="2 sto 1 sto 1 rcl fact 2 rcl fact 1 rcl 2 rcl - fact * /"
  944.  
  945. Um z.B. 5 über 3 zu berechnen, gibt man ein:
  946.  
  947.     upn 5 3 $BKOEFF
  948.  
  949. Um die Summe aller Zahlen von 1 bis zu einem x zu berechnen, kann
  950. man folgendes Programm benutzen:
  951.  
  952.     SUM="dup sqr + 2 /"
  953.  
  954. Dann berechnet "upn 5 $SUM" die Summe der Zahlen von 1 bis 5.
  955.  
  956. Dies funktioniert auch mit dem calc-Shellscript.
  957.  
  958.